home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / latex209 / contrib / eepic / grafig.c < prev    next >
C/C++ Source or Header  |  1994-11-08  |  4KB  |  184 lines

  1. /*
  2.  * GraFig 0.0 - Generates Numerical Graphs in Fig Code
  3.  *
  4.  * Author:    Micah Beck
  5.  *        (email: beck@cs.cornell.edu)
  6.  *        Dept. of Computer Science
  7.  *        Cornell University
  8.  *
  9.  * Version 0.0:    February 1, 1989
  10.  */
  11. #include <stdio.h>
  12. #include "object.h"
  13.  
  14. #define FIG_MAGIC    "#FIG 1.4"
  15. #define RES    80
  16. #define COORD_SYS    2
  17.  
  18. #define MAX_DATA    1000
  19.  
  20. #define MARK_SIZE    .05
  21. #define TIC_SIZE    .1
  22. #define NUM_OFF_X    .5
  23. #define NUM_OFF_Y    .25
  24.  
  25. #define orig_x        1.0
  26. #define orig_y        9.0
  27. #define length_x    5.0
  28. #define length_y    5.0
  29.  
  30. extern double pow(), floor(), log10();
  31.  
  32. struct datapt {double x, y} dataset[MAX_DATA], *datasort[MAX_DATA];
  33.  
  34. main(argc,argv)
  35. int argc;
  36. char **argv;
  37. {
  38.   int i, c, data_size, datacmp();
  39.   double tic();
  40.   double max_x, max_y, min_x, min_y;
  41.   double dx, dy;
  42.   double tic_x, tic_y, w;
  43.  
  44.   /* read data */
  45.   for (data_size=0, c=2; data_size<MAX_DATA-1 && c == 2; data_size++)
  46.     c = scanf("%lf %lf", &dataset[data_size].x, &dataset[data_size].y);
  47.  
  48.   if (c == EOF)
  49.     --data_size;
  50.   else
  51.         if (c != 2)
  52.         error("bad data format");
  53.     else
  54.         error("data set truncated");
  55.  
  56.   if (data_size == 0) error("no data!");
  57.  
  58.   /* calculate maxima */
  59.   max_x = max_y = dataset[0].x;
  60.   for (i=1; i<data_size; i++) {
  61.     if (max_x < dataset[i].x) max_x = dataset[i].x;
  62.     if (max_y < dataset[i].y) max_y = dataset[i].y;
  63.   }
  64.  
  65.   /* calculate scaling factors */
  66.   dx = length_x / max_x;
  67.   dy = length_y / max_y;
  68.  
  69.   /* print FIG header */
  70.   printf("%s\n", FIG_MAGIC);
  71.   printf("%d %d\n", RES, COORD_SYS);
  72.  
  73.   /* draw axes */
  74.   fig_comment("Graph Axes");
  75.   fig_line(orig_x, orig_y, orig_x+length_x, orig_y);
  76.   fig_line(orig_x, orig_y, orig_x, orig_y-length_y);
  77.  
  78.   /* plot data points */
  79.   fig_comment("Data Points");
  80.   for (i=0; i<data_size; i++) {
  81.  
  82.     dataset[i].x = orig_x + (dataset[i].x * dx);
  83.     dataset[i].y = orig_y - (dataset[i].y * dy);
  84.  
  85.     fig_line(dataset[i].x-MARK_SIZE, dataset[i].y,
  86.          dataset[i].x+MARK_SIZE, dataset[i].y);
  87.     fig_line(dataset[i].x, dataset[i].y-MARK_SIZE,
  88.          dataset[i].x, dataset[i].y+MARK_SIZE);
  89.   }
  90.  
  91.   fig_comment("Data Curve");
  92.   qsort((char *)dataset, data_size, sizeof(struct datapt), datacmp);
  93.   fig_plot(dataset, data_size);
  94.  
  95.   /* draw tic marks with numbering */
  96.   fig_comment("Axis Numbering");
  97.   tic_x = tic(max_x);
  98.   tic_y = tic(max_y);
  99.  
  100.   for (i=1; (i*tic_x)<=max_x; i++) {
  101.     w = orig_x + i*tic_x*dx;
  102.     fig_line(w, orig_y, w, orig_y+TIC_SIZE);
  103.     fig_number(w, orig_y+NUM_OFF_Y, i*tic_x);
  104.   }
  105.   for (i=1; (i*tic_y)<=max_y; i++) {
  106.     w = orig_y - i*tic_y* dy;
  107.     fig_line(orig_x, w, orig_x-TIC_SIZE, w);
  108.     fig_number(orig_x-NUM_OFF_X, w, i*tic_y);
  109.   }
  110. }
  111.  
  112. error(s)
  113. char *s;
  114. {
  115.   fprintf(stderr, "grafig: %s\n", s);
  116.   exit(1);
  117. }
  118.  
  119. double tic(r)
  120. double r;
  121. {
  122.   double t;
  123.  
  124.   t = pow(10.0, floor(log10(r)));
  125.   if (2*t>r)    return t/10;
  126.   else        return t;
  127. }
  128.  
  129. datacmp(a, b)
  130. struct datapt *a, *b;
  131. {
  132.   if (a->x < b->x) return -1;
  133.   if (a->x > b->x) return 1;
  134.   return 0;
  135. }
  136.  
  137. /*
  138.  *  Fig Code Generating Routines 
  139.  */
  140. fig_comment(str)
  141. char *str;
  142. {
  143.   printf("#\n# %s\n#\n", str);
  144. }
  145.  
  146. fig_line(ax, ay, bx, by)
  147. double ax, ay, bx, by;
  148. {
  149.   printf("%d %d %d %d %d %d %d %d %6.3f  %d %d\n",
  150.      O_POLYLINE, T_POLYLINE,
  151.      SOLID_LINE, 1, DEFAULT, DEFAULT, DEFAULT, DEFAULT, 0.0,
  152.      0, 0);
  153.   printf("%.0f %.0f %.0f %.0f 9999 9999\n",
  154.      ax*RES, ay*RES, bx*RES, by*RES);
  155. }
  156.  
  157. fig_plot(dp, ds)
  158. struct datapt *dp;
  159. int ds;
  160. {
  161.   int i;
  162.  
  163.   printf("%d %d %d %d %d %d %d %d %6.3f  %d %d\n",
  164.      O_POLYLINE, T_POLYLINE,
  165.      SOLID_LINE, 1, DEFAULT, DEFAULT, DEFAULT, DEFAULT, 0.0,
  166.      0, 0);
  167.   for (i=0; i<ds; i++)
  168.     printf("%.0f %.0f ", dp[i].x*RES, dp[i].y*RES);
  169.  
  170.   printf("9999 9999\n");
  171. }
  172.  
  173. fig_number(x, y, num)
  174. double x, y, num;
  175. {
  176.   char buf[10];
  177.  
  178.   sprintf(buf, "%6lg", num);
  179.   printf("%d %d %d %d %d %d %d %6.3f %d %d %d %.0lf %.0lf %s\01\n",
  180.     O_TEXT, T_LEFT_JUSTIFIED,
  181.     DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, 0.0, DEFAULT,
  182.     16, 8*strlen(buf), x*RES, y*RES, buf);
  183. }
  184.